// #include <bits/stdc++.h>
// using namespace std;
// #define yes cout<<"YES"<<endl
// #define no cout<<"NO"<<endl
// using ll = long long;
// int n, q;
// #define rep1(i, n) for (int i = 1;i<=n;i++)
// int lowbit(int x) { return x & (-x); }
// int is_pow(int x) { return (x & (x - 1))==0; }
// const int N =1e6+10;
// const int mod = 998244353;
// int a[N], A[N], Blb[N];
// int suma = 0, sumb = 0, sumlb = 0;;
// vector<int> B;
// void solve()
// {
//     cin >> n >> q;
//     rep1(i,n) {
//         cin >> a[i];
//         if(is_pow(a[i]))
//         {
//             suma = (suma + a[i] )% mod;
//         }
//         else
//         {
//             sumb = (sumb + a[i] )% mod;
//             B.push_back(a[i]);
//             int lb=lowbit(a[i]);
//             sumlb = (sumlb + lb)% mod;
//         }
//     }
//     int ans = 0;
//     ans=(ans+suma+sumb )%mod;
//     int op;
//     while(q--)
//     {
//         cin >> op;
//         if(op==2)
//         {
//             cout << ans %mod<< "\n";
//         }
//         else 
//         {
//             ans = ((suma + sumlb) % mod+ans)%mod;
//             suma = (suma * 2) % mod;
//             int i=0;
//             while(i<B.size())
//             {
//                 int now=B[i],lb=lowbit(B[i]);
//                 int neew=now+lb,newlb=lowbit(neew);
//                 if(is_pow(neew))
//                 {
//                     suma=(suma+neew)%mod;
//                     sumlb = (sumlb - lb + mod) % mod;
//                     swap(B[i],B.back());
//                     B.pop_back();
//                 }
//                 else {
//                     sumlb = (sumlb + newlb - lb + mod) % mod;
//                     B[i]=neew;
//                     i++;
//                 }
//             }
//         }
//     }

// }
// int main()
// {
//     int t = 1;
//     //cin >> t;
//     while(t--)
//     {
//         solve();
//     }
//    return 0;
// }
#include <bits/stdc++.h>
using namespace std;

const int mod = 998244353;
#define int long long // 使用 long long 防止溢出

int n, q, a, sumA = 0, sumB = 0, sumBlb = 0, op, ans;
vector<int> groupB;

// 计算 lowbit
int lowbit(int x)
{
    return x & (-x);
}

// 判断是否是 2 的幂
bool isPower(int x)
{
    return x > 0 && (x & (x - 1)) == 0;
}

signed main()
{
    cin >> n >> q;
    for (int i = 0; i < n; i++)
    {
        cin >> a;
        if (isPower(a))
        {
            sumA = (sumA + a) % mod; // A组求和
        }
        else
        {
            groupB.push_back(a);                 // 元素放入B组
            sumB = (sumB + a) % mod;             // B组求和
            sumBlb = (sumBlb + lowbit(a)) % mod; // B组元素的 lowbit 求和
        }
    }

    ans = (sumA + sumB) % mod; // 初始状态总和

    while (q--)
    {
        cin >> op;
        if (op == 1)
        {
            // 计算本次操作的总贡献
            ans = ((sumA + sumBlb) % mod + ans) % mod;

            // 更新 A 组总和（所有 2 的幂 * 2）
            sumA = (sumA * 2) % mod;

            // 下面开始处理 groupB 中的元素
            int i = 0;
            while (i < groupB.size())
            {
                int now = groupB[i];
                int lb = lowbit(now);
                int neew = now + lb;
                int newlb = lowbit(neew);

                if (isPower(neew))
                { // 如果变成 2 的幂
                    sumA = (sumA + neew) % mod;
                   // sumB = (sumB - now + mod) % mod;
                    sumBlb = (sumBlb - lb + mod) % mod;
                    swap(groupB[i], groupB.back()); // 交换到末尾
                    groupB.pop_back();              // 并删除
                }
                else
                {                                                 // 留在 B 组
                   // sumB = (sumB - now + neew + mod) % mod;
                    sumBlb = (sumBlb - lb + newlb + mod) % mod;
                    groupB[i] = neew;
                    i++;
                }
            }
        }
        else if (op == 2)
        {
            cout << ans << "\n";
        }
    }

    return 0;
}